#!/bin/bash
################################################################################
#  Copyright (C) 2025 IQIYI All rights reserved.
#
#  Author     : 王海斌
#  E-mail     : wanghaibin@qiyi.com
#  Version    :
#  Date       : Fri 31 Oct 2025 09:41:31 AM CST
#  Destription: 执行test程序,如果执行时间超过30分钟,则使用gdb打印所有线程的堆栈信息
#               并返回错误；否则返回 ./test 的执行结果
#
################################################################################
cd `dirname $0`

#  是否显示执行过程
#set -x 

#!/bin/bash

# 设置超时时间（30分钟 = 1800秒）
TIMEOUT_SECONDS=1800

# 启动 ./test 并在后台运行
./test &
TEST_PID=$!

# 记录开始时间
START_TIME=$(date +%s)

# 等待进程结束或超时
while true; do
    # 检查进程是否仍在运行
    if ! kill -0 $TEST_PID 2>/dev/null; then
        # 进程已结束，获取退出状态
        wait $TEST_PID
        EXIT_STATUS=$?
        echo "程序执行完成，返回状态: $EXIT_STATUS"
        exit $EXIT_STATUS
    fi

    # 计算已运行时间
    CURRENT_TIME=$(date +%s)
    ELAPSED_TIME=$((CURRENT_TIME - START_TIME))

    # 检查是否超时
    if [ $ELAPSED_TIME -ge $TIMEOUT_SECONDS ]; then
        echo "程序执行超时（超过 $TIMEOUT_SECONDS 秒），正在获取线程堆栈信息..."

        # 使用 gdb 获取所有线程堆栈信息
        gdb -batch -ex "attach $TEST_PID" \
            -ex "thread apply all bt full" \
            -ex "detach" \
            -ex "quit" > gdb_stacktrace.log 2>&1

        echo "线程堆栈信息已保存到 gdb_stacktrace.log"

        # 杀死进程
        kill -9 $TEST_PID
        exit 1
    fi

    # 休眠 1 秒后再次检查
    sleep 1
done

